"""
A股数据采集系统 - 主程序入口
"""
import time
import os
import signal
import sys
from loguru import logger
from flask import Flask
from flask_cors import CORS
from threading import Thread

from utils.logger import setup_logger
from utils.db_utils import initialize_database, clear_old_realtime_data, clear_old_daily_data
from scheduler.task_scheduler import get_scheduler
from api.routes import api

from config.settings import (
    REALTIME_DATA_KEEP_DAYS,
    DAILY_DATA_KEEP_DAYS
)

# 设置日志
setup_logger()

def create_app():
    """创建Flask应用"""
    app = Flask(__name__)
    
    # 启用CORS
    CORS(app)
    
    # 注册蓝图
    app.register_blueprint(api, url_prefix='/api')
    
    return app

def run_flask_app(app):
    """在独立线程中运行Flask应用"""
    app.run(host='0.0.0.0', port=5000, debug=False, use_reloader=False)

def signal_handler(sig, frame):
    """处理退出信号"""
    logger.info("接收到退出信号，正在停止任务...")
    scheduler = get_scheduler()
    scheduler.shutdown()
    logger.info("系统已安全退出")
    sys.exit(0)

def show_banner():
    """显示程序启动横幅"""
    banner = r"""
    ╔═══════════════════════════════════════════════════╗
    ║                                                   ║
    ║               A股数据采集系统                      ║
    ║                                                   ║
    ║          股票基本信息和行情数据自动采集             ║
    ║                                                   ║
    ╚═══════════════════════════════════════════════════╝
    """
    print(banner)

def main():
    """主程序入口"""
    # 显示横幅
    show_banner()
    
    try:
        # 设置信号处理
        signal.signal(signal.SIGINT, signal_handler)
        signal.signal(signal.SIGTERM, signal_handler)
        
        # 初始化数据库
        logger.info("开始初始化数据库...")
        if not initialize_database():
            logger.error("数据库初始化失败，程序退出")
            return
            
        # 创建并启动Flask应用（在独立线程中）
        logger.info("启动Flask Web服务...")
        app = create_app()
        flask_thread = Thread(target=run_flask_app, args=(app,))
        flask_thread.daemon = True  # 设置为守护线程，这样主程序退出时会自动结束
        flask_thread.start()
        
        # 清理过期实时数据
        logger.info("开始清理过期实时数据...")
        clear_old_realtime_data(REALTIME_DATA_KEEP_DAYS)           
        logger.info("过期实时数据清理完成") 
        
        # 清理过期每日数据
        logger.info("开始清理过期每日数据...")  
        clear_old_daily_data(DAILY_DATA_KEEP_DAYS)
        logger.info("过期每日数据清理完成")
    

        # 启动定时任务调度器
        logger.info("开始启动定时任务...")
        scheduler = get_scheduler()
        scheduler.start()
        
        # 输出当前任务状态
        jobs = scheduler.get_jobs()
        logger.info(f"当前已设置 {len(jobs)} 个定时任务:")
        for job in jobs:
            logger.info(f"  - {job.name}: 下次执行时间 {job.next_run_time}")
        
        # 保持主程序运行
        logger.info("系统启动完成，正在运行中...")
        
        # 主循环 - 用于保持程序运行并监控系统状态
        while True:
            # 检查Flask线程是否正常运行
            if not flask_thread.is_alive():
                logger.error("Flask服务已停止运行，正在重启...")
                flask_thread = Thread(target=run_flask_app, args=(app,))
                flask_thread.daemon = True
                flask_thread.start()
            
            # 每分钟检查一次
            time.sleep(60)
            
    except Exception as e:
        logger.error(f"程序运行异常: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()